#include<iostream>
using namespace std;
#include<pthread.h>
#include<unistd.h>
#include<vector>
#include<string>

#define NUM 10
class ThreadData{

public:
    pthread_t _tid;
    char buffer[128];
};


void* start_routine(void* args){
    //const char* name = (const char*)args;
    //string* name = (string*)args;
    ThreadData* name = static_cast<ThreadData*>(args);
    int cnt = 10;
    while(cnt){
        //cout<<"我是新线程："<<*name<<"cnt:"<<cnt<<endl;

        cout<<"我是新线程："<<name->buffer<<"cnt:"<<cnt<<endl;
        cnt--;
        sleep(1);
    }

    delete name;
    return nullptr;

}



//实现创建多线程
int main(){
    //vector<pthread_t> tids(NUM);

    //这么写是不对的，因为线程的运行是没有先后之分的，那么就造成了主线程创建了buffer，还没来得及写入新线程，就又执行下一次循环的snprint了
    //这样buffer一直被覆盖。就得不到正确的结果
    // for(int i = 0;i<NUM;i++){
    //     //pthread_t tid;
    //     char buffer[128];
    //     snprintf(buffer,sizeof buffer,"thread:%d",i+1);
    //     pthread_create(&tids[i],nullptr,start_routine,buffer);
    // }

    vector<ThreadData*> tids;
    //解决方法：利用类来封装
    for(int i = 0;i<NUM;i++){
        ThreadData* td = new ThreadData();//在堆上面开辟空间，这样就有10个不同的类了，不会被覆盖了
        snprintf(td->buffer,sizeof(td->buffer),"%s:%d","thread",i+1);
        pthread_create(&td->_tid,nullptr,start_routine,td);
        tids.push_back(td);
    }


    for(auto& e : tids){
        cout<<"tid:"<<e->_tid<<"创建出来的新线程："<<e->buffer<<endl;
    }
    sleep(5);
    for(auto e: tids){
        pthread_join(e->_tid,nullptr);
        cout<<"线程等待成功"<<endl;
    }
    // while(true){
    //     cout<<"我是主线程："<<endl;
    //     sleep(1);
    // }


    return 0;
}